cp 命令

通过编写cp命令来了解Unix读写文件

准备知识

创建文件

创建活重写文件的一种方法是使用系统调用函数 creat(注意没有e)

  creat
Target Create/rewirte a file
Header #include <fcntl.h>
Origin int fd = create(char *filename, mode_t mode)
Args filename file name, mode access mode
Return -1 error, fd success

creat告诉内核创建一个名为filename的文件, 如果这个文件不存在, 就创建它, 如果已存在, 就把它的你日工清空, 把文件长度设为0

如果内核成功地创建了文件, 那么文件的权限位被设置为由第二个参数mode所指定的值

fd = creat("addressbook", 0644);

创建一个名为 addressbook的文件, 如果文件不存在, 那么文件的权限位被设为rw-r--r--.如果文件已经存在, 内容被清空. fd将指向 addressbook的文件描述符

写文件

write系统调用向已打开的文件中写入数据

  write
Target Write the data to file from memory
Header #include <unistd.h>
Origin ssize_t result = write(int fd, void *buf, size_t amt)
Args fd file description, buf data in member, amt bytes of data
Return -1 error, num written success

cp1.c

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

#define BUFFERSIZE 4096
#define COPYMODE 0644

void oops(char *, char *);

int main (int argc, char *argv[])
{
    int in_fd, out_fd, n_chars;
    char buf[BUFFERSIZE];

    if (argc != 3) {
        fprintf(stderr, "usage: %s source destination\n", *argv);
        exit(1);
    }

    if ((in_fd = open(argv[1], O_RDONLY)) == -1)
        oops("Cannot open", argv[1]);

    if ((out_fd = creat(argv[2], COPYMODE)) == -1)
        oops("Cannot creat", argv[2]);

    while ((n_chars = read(in_fd, buf, BUFFERSIZE))> 0)
        if (write(out_fd, buf, n_chars) != n_chars)
            oops("Write error to", argv[2]);

    if (close(in_fd) == -1 || close(out_fd) == -1)
        oops("Error closing files", "");
}

void oops(char *s1, char *s2)
{
    fprintf(stderr, "Error: %s ", s1);
    perror(s2);
    exit(1);
}